package cn.xeblog.plugin.action;

import cn.xeblog.commons.entity.game.GameDTO;
import cn.xeblog.commons.entity.Response;
import cn.xeblog.commons.enums.Game;
import cn.xeblog.plugin.factory.GameFactory;
import cn.xeblog.plugin.game.AbstractGame;

/**
 * 游戏行为
 *
 * @author anlingyi
 * @date 2020/8/31
 */
public class GameAction {

  /**
   * 游戏枚举
   */
  private static Game game;

  /**
   * 游戏抽象对象
   */
  private static AbstractGame action;

  /**
   * 我的昵称
   */
  private static String nickname;

  /**
   * 邀请人昵称
   */
  private static String inviter;

  /**
   * 当前游戏房间号
   */
  private static String roomId;

  /**
   * 设置房间号
   *
   * @param roomId 房间号
   */
  public static void setRoomId(String roomId) {
    GameAction.roomId = roomId;
  }

  /**
   * 获取房间号
   *
   * @return 房间号
   */
  public static String getRoomId() {
    return roomId;
  }

  /**
   * 是否游戏离线
   *
   * @return true, 游戏离线.否则, false
   */
  public static boolean isOfflineGame() {
    return roomId == null;
  }

  /**
   * 获取昵称
   *
   * @return 昵称
   */
  public static String getNickname() {
    return nickname;
  }

  /**
   * 设置昵称
   *
   * @param nickname 昵称
   */
  public static void setNickname(String nickname) {
    GameAction.nickname = nickname;
  }

  /**
   * 设置游戏信息
   *
   * @param game 游戏
   */
  public static void setGame(Game game) {
    GameAction.game = game;
  }

  /**
   * 设置邀请人
   *
   * @param inviter 邀请人
   */
  public static void setInviter(String inviter) {
    GameAction.inviter = inviter;
  }

  /**
   * 获取邀请人
   *
   * @return 邀请人
   */
  public static String getInviter() {
    return inviter;
  }

  /**
   * 是否发起者
   *
   * @return true, 发起者, 否则, false
   */
  public static boolean isProactive() {
    return inviter == null;
  }

  /**
   * 获取游戏信息
   *
   * @return 游戏信息
   */
  public static Game getGame() {
    return game;
  }

  /**
   * 获取游戏名称
   *
   * @return 游戏名称
   */
  public static String getName() {
    if (game == null) {
      return "";
    }

    return game.getName();
  }

  /**
   * 游戏响应数据处理
   *
   * @param response 响应对象
   */
  public static void handle(Response<GameDTO> response) {
    if (playing()) {
      action.handle(response.getBody());
    }
  }

  /**
   * 结束游戏
   */
  public static void over() {
    if (playing()) {
      action.over();
    }
    // 清理游戏相关联信息
    clean();
  }

  /**
   * 获取游戏对象
   *
   * @return 游戏对象
   */
  public static AbstractGame create() {
    if (game == null) {
      return null;
    }

    // 获取游戏对象
    GameAction.action = GameFactory.produce(game);
    return action;
  }

  /**
   * 清空游戏相关信息
   */
  public static void clean() {
    game = null;
    action = null;
    inviter = null;
    nickname = null;
    roomId = null;
  }

  /**
   * 是否可以开始玩游戏
   *
   * @return true, 可以 , 否则, false
   */
  public static boolean playing() {
    return action != null;
  }

  /**
   * 游戏是否结束
   *
   * @return true, 游戏结束, 否则, false
   */
  public static boolean isOver() {
    return game == null;
  }

  /**
   * 获取游戏对象
   *
   * @return 游戏对象
   */
  public static AbstractGame getAction() {
    return action;
  }
}
